From 2912a41dd1cf1d1372e0e715a32544ad7afe3664 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Fri, 26 Aug 2005 10:51:10 +0000 Subject: [PATCH] Fix vnets in xm. The removal of 'xm call' to call a xend interface function directly made the xend vnet functions inaccessible. This patch adds those functions to xm and fixes the persistence in XmVnet to use xenstore. Signed-off-by: Mike Wray Signed-off-by: Christian Limpach --- tools/python/xen/util/Brctl.py | 1 + tools/python/xen/xend/XendVnet.py | 58 ++++++++++++++++------ tools/python/xen/xend/server/SrvVnetDir.py | 1 + tools/python/xen/xm/main.py | 52 ++++++++++++++++++- 4 files changed, 95 insertions(+), 17 deletions(-) diff --git a/tools/python/xen/util/Brctl.py b/tools/python/xen/util/Brctl.py index 7a6f4871df..28506057f2 100644 --- a/tools/python/xen/util/Brctl.py +++ b/tools/python/xen/util/Brctl.py @@ -76,6 +76,7 @@ def bridge_set(bridge, hello=None, fd=None, stp=None): def bridge_del(bridge): """Delete a bridge. """ + cmd(CMD_IFCONFIG, '%s down' % bridge) cmd(CMD_BRCTL, 'delbr %s' % bridge) def routes(): diff --git a/tools/python/xen/xend/XendVnet.py b/tools/python/xen/xend/XendVnet.py index a21e5647df..5ed7ee1d64 100644 --- a/tools/python/xen/xend/XendVnet.py +++ b/tools/python/xen/xend/XendVnet.py @@ -22,7 +22,7 @@ from xen.util import Brctl from xen.xend import sxp from xen.xend.XendError import XendError from xen.xend.XendLogging import log -from xen.xend.xenstore import XenNode, DBMap +from xen.xend.xenstore import XenNode, DBMap, DBVar def vnet_cmd(cmd): out = None @@ -38,17 +38,40 @@ def vnet_cmd(cmd): class XendVnetInfo: vifctl_ops = {'up': 'vif.add', 'down': 'vif.del'} + + __exports__ = [ + DBVar('id', ty='str'), + DBVar('dbid', ty='str'), + DBVar('config', ty='sxpr'), + ] - def __init__(self, config): - self.config = config - self.id = sxp.child_value(config, 'id') - self.id = str(self.id) + def __init__(self, db, config=None): + if config: + self.id = sxp.child_value(config, 'id') + self.id = str(self.id) + self.dbid = self.id.replace(':', '-') + self.db = db.addChild(self.dbid) + self.config = config + else: + self.db = db + self.importFromDB() + config = self.config + self.bridge = sxp.child_value(config, 'bridge') if not self.bridge: self.bridge = "vnet%s" % self.id self.vnetif = sxp.child_value(config, 'vnetif') if not self.vnetif: - self.vnetif = "vnetif%s" % self.id + self.vnetif = "vnif%s" % self.id + + def saveToDB(self, save=False, sync=False): + self.db.saveDB(save=save, sync=sync) + + def exportToDB(self, save=False, sync=False): + self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync) + + def importFromDB(self): + self.db.importFromDB(self, fields=self.__exports__) def sxpr(self): return self.config @@ -64,7 +87,9 @@ class XendVnetInfo: log.info("Deleting vnet %s", self.id) Brctl.vif_bridge_rem({'bridge': self.bridge, 'vif': self.vnetif}) Brctl.bridge_del(self.bridge) - return vnet_cmd(['vnet.del', self.id]) + val = vnet_cmd(['vnet.del', self.id]) + self.db.delete() + return val def vifctl(self, op, vif, vmac): try: @@ -82,16 +107,18 @@ class XendVnet: def __init__(self): # Table of vnet info indexed by vnet id. self.vnet = {} - self.dbmap = DBMap(db=XenNode(self.dbpath)) - self.dbmap.readDB() - for vnetdb in self.dbmap.values(): - config = vnetdb.config - info = XendVnetInfo(config) - self.vnet[info.id] = info + self.db = DBMap(db=XenNode(self.dbpath)) + self.db.readDB() + for vnetdb in self.db.values(): try: + info = XendVnetInfo(vnetdb) + self.vnet[info.id] = info info.configure() except XendError, ex: log.warning("Failed to configure vnet %s: %s", str(info.id), str(ex)) + except Exception, ex: + log.exception("Vnet error") + vnetdb.delete() def vnet_of_bridge(self, bridge): """Get the vnet for a bridge (if any). @@ -128,9 +155,9 @@ class XendVnet: @param config: config """ - info = XendVnetInfo(config) + info = XendVnetInfo(self.db, config=config) self.vnet[info.id] = info - self.dbmap["%s/config" % info.id] = info.sxpr() + info.saveToDB() info.configure() def vnet_delete(self, id): @@ -141,7 +168,6 @@ class XendVnet: info = self.vnet_get(id) if info: del self.vnet[id] - self.dbmap.delete(id) info.delete() def instance(): diff --git a/tools/python/xen/xend/server/SrvVnetDir.py b/tools/python/xen/xend/server/SrvVnetDir.py index f8fd807c63..5dc5b591b2 100644 --- a/tools/python/xen/xend/server/SrvVnetDir.py +++ b/tools/python/xen/xend/server/SrvVnetDir.py @@ -19,6 +19,7 @@ from xen.xend import sxp from xen.xend.Args import FormFn from xen.xend import PrettyPrint from xen.xend import XendVnet +from xen.xend.XendError import XendError from xen.web.SrvDir import SrvDir diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index 6fa4bab307..5c8e4b01ff 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -105,6 +105,11 @@ xm full list of subcommands: Limit the transmission rate of a virtual network interface network-list List virtual network interfaces for a domain + Vnet commands: + vnet-list [-l|--long] list vnets + vnet-create create a vnet from a config file + vnet-delete delete a vnet + For a short list of subcommands run 'xm help' For more help on xm see the xm(1) man page For more help on xm create, see the xmdomain.cfg(5) man page""" @@ -547,6 +552,47 @@ def xm_block_destroy(args): from xen.xend.XendClient import server server.xend_domain_device_destroy(dom, 'vbd', dev) +def xm_vnet_list(args): + from xen.xend.XendClient import server + try: + (options, params) = getopt(args, 'l', ['long']) + except GetoptError, opterr: + err(opterr) + sys.exit(1) + + use_long = 0 + for (k, v) in options: + if k in ['-l', '--long']: + use_long = 1 + + if params: + use_long = 1 + vnets = params + else: + vnets = server.xend_vnets() + + for vnet in vnets: + try: + if use_long: + info = server.xend_vnet(vnet) + PrettyPrint.prettyprint(info) + else: + print vnet + except Exception, ex: + print vnet, ex + +def xm_vnet_create(args): + arg_check(args, 1, "vnet-create") + conf = args[0] + from xen.xend.XendClient import server + server.xend_vnet_create(conf) + +def xm_vnet_delete(args): + arg_check(args, 1, "vnet-delete") + vnet = args[0] + from xen.xend.XendClient import server + server.xend_vnet_delete(vnet) + commands = { # console commands "console": xm_console, @@ -592,7 +638,11 @@ commands = { "block-refresh": xm_block_refresh, # network "network-limit": xm_network_limit, - "network-list": xm_network_list + "network-list": xm_network_list, + # vnet + "vnet-list": xm_vnet_list, + "vnet-create": xm_vnet_create, + "vnet-delete": xm_vnet_delete, } aliases = { -- 2.30.2